package com.biovr.backend.utils;

import com.qiniu.common.Zone;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * Created by jnmcl on 2017/7/7.
 */
@Component
public class QiniuUtils {
  public String getAccessKey() {
    return accessKey;
  }

  @Value("${qn.ak}")
  private String accessKey;

  public String getSecretKey() {
    return secretKey;
  }

  @Value("${qn.sk}")
  private String secretKey;

  public String getBucket() {
    return bucket;
  }

  @Value("${qn.bucket}")
  private String bucket;
  @Value("${qn.baseUrl}")
  private String baseUrl;

  public FileInfo[] listAllFiles(){
    //构造一个带指定Zone对象的配置类
    Configuration cfg = new Configuration(Zone.zone0());
    Auth auth = Auth.create(accessKey, secretKey);
    BucketManager bucketManager = new BucketManager(auth, cfg);
//文件名前缀
    String prefix = "";
//每次迭代的长度限制，最大1000，推荐值 1000
    int limit = 1000;
//指定目录分隔符，列出所有公共前缀（模拟列出目录效果）。缺省值为空字符串
    String delimiter = "";

//列举空间文件列表
    BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, prefix, limit, delimiter);
    FileInfo[] items=null;
    while (fileListIterator.hasNext()) {
      //处理获取的file list结果
        items = fileListIterator.next();
      for (FileInfo item : items) {
//        System.out.println(item.key);
//        System.out.println(item.hash);
//        System.out.println(item.fsize);
//        System.out.println(item.mimeType);
//        System.out.println(item.putTime);
//        System.out.println(item.endUser);
        item.key=baseUrl+item.key;
      }
    }
    return  items;
  }



  /**
   * 生成一般上传凭证和覆盖上传凭证
   *  覆盖上传除了需要简单上传所需要的信息之外，还需要想进行覆盖的文件名称key，
   这个文件名称同时可是客户端上传代码中指定的文件名，两者必须一致。
   callBackUrl为上传成功回调地址
   * @return
   */
//  public String getUpToken(String key,long expireSeconds)
//  {
//    Auth auth = Auth.create(accessKey, secretKey);
//    StringMap putPolicy = new StringMap();
//    putPolicy.put("callbackBodyType", "application/json");
//    putPolicy.put("callbackBody",
//      callbackBody==null?
//        "{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize)}"
//        :callbackBody);
//
//    if(callBackUrl!=null){
//      putPolicy.put("callbackUrl", callBackUrl);
//    }
//
//    putPolicy.put("callbackBody","{\"key\":\"$(key)\",\"hash\":\"$(etag)\",\"bucket\":\"$(bucket)\",\"fsize\":$(fsize)}");
//
//    String upToken = auth.uploadToken(bucket, key, expireSeconds, putPolicy);
//    return upToken;
//  }

  /**
   * 生成简易上传凭证
   * @return
   */
  public  String getUpToken(){
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken = auth.uploadToken(bucket);
    return upToken;
  }

  /**
   * 生成指定key的上传凭证
   * @param key
   * @return
   */
  public  String getUpToken(String key){
    Auth auth = Auth.create(accessKey, secretKey);
   String upToken = auth.uploadToken(bucket, key);
    return upToken;
  }

  /**
   * 生成指定删除日期的上传凭证
   * @param expireSeconds
   * @return
   */
  public  String getUpToken(Long expireSeconds){
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken = auth.uploadToken(bucket, null,expireSeconds,null);
    return upToken;
  }
  /**
   * 生成自动过期上传凭证
   * @param key 文件名（覆盖）
   * @param expireSeconds 过期事件，0为永不过期
   * @return
   */
  public  String getUpToken(String key,long expireSeconds){
    Auth auth = Auth.create(accessKey, secretKey);
    String upToken =  auth.uploadToken(bucket, key,expireSeconds,null);
    return upToken;
  }

}
